﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托06_多播委托
{
    class Program
    {
        static void Main(string[] args)
        {
            Action a = M1;
            a += M2;
            //a();
            a.DynamicInvoke();

            // 当一个委托没有指向任何一个方法的时候，调用会出现空引用异常
            // 如果是有返回值的委托，那么多播委托（委托链）只能得到链中最后一个方法的返回值
            // 我们一般会把多播委托的返回值定义成void
            // 多播委托实际上就是一个逐个调用的委托集合
            // 通过多播委托调用的任何一个方法出现了异常，整个迭代就会停止

            // 得到多播委托中所有的单个委托
            Delegate[] dlgts = a.GetInvocationList();
            foreach (Delegate item in dlgts)
            {
                item.DynamicInvoke();
            }
        }

        public static void M1()
        {
            Console.WriteLine("M1");
            // throw new Exception();
        }
        public static void M2()
        {
            Console.WriteLine("M2");
        }
    }
}
